package clases;

import com.lowagie.text.Font;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**
 *
 * @author MK
 */
public class ClsTabla {

    //___________________________________________________________________________________ Soy una barra separadora :)
    /**
     *
     * @param table el JTable, generalmente este JTable tiene que tener la propiedad de:
     *          .setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     *      Pero funciona muy bien en cualquier modo que se elija, por ejemplo:
     *
     * @param margin es el margen que se aumenta al datos mas largo para que sea mejor visible
     * @see http://www.devmedia.com.br/articles/viewcomp.asp?comp=2136&hl=
     */
    public void packColumns(JTable table, int margin) {
        for (int c=0; c<table.getColumnCount(); c++) {
          packColumn(table, c, 2);
        }
    }
    /**
     * Ajusta el ancho de cada columna de un JTable, pues en una fila algunas
     * veces existen datos de longitud muy larga, el cual no se muestran bien en
     * los JTable este metodo identifica el dato mas largo en una columna y ajusta
     * el ancho de la columna al ancho del dato mas ancho en longitud, quedando
     * columnas que muestren datos visibles al usuario...
     * @param table es el JTable
     * @param vColIndex hace referencia al indice de la columna de un JTable,
     *          Ejemplo: Column[0], Column[1], Column[2] --> Hay 3 columnas
     * @param margin es el margen que se aumenta al datos mas largo para que sea mejor visible
     * @see http://www.devmedia.com.br/articles/viewcomp.asp?comp=2136&hl=
     */
    public void packColumn(JTable table, int vColIndex, int margin) {
//        TableModel model = table.getModel();
        DefaultTableColumnModel colModel = (DefaultTableColumnModel)table.getColumnModel();
        TableColumn col = colModel.getColumn(vColIndex);
        int width = 0;// Obtiene el ancho de la cabecera de la columna
        TableCellRenderer renderer = col.getHeaderRenderer();
        if (renderer == null) {
            renderer = table.getTableHeader().getDefaultRenderer();
        }
        Component comp = renderer.getTableCellRendererComponent(
            table, col.getHeaderValue(), false, false, 0, 0);

        width = comp.getPreferredSize().width;// Obtiene la maxima columna de los datos
       for (int r=0; r<table.getRowCount(); r++) {
            renderer = table.getCellRenderer(r, vColIndex);
            comp = renderer.getTableCellRendererComponent(
                    table, table.getValueAt(r, vColIndex), false, false, r,vColIndex);

            width = Math.max(width, comp.getPreferredSize().width);
        }
       width += 2*margin;// Configura la longitud teniendo encuenta el margen y lo multiplica por 2
       col.setPreferredWidth(width);//Se añade el ancho final a la columna
    }
    //___________________________________________________________________________________ Soy una barra separadora :)
    /**
     * @autor MK
     * @version 1.0
     * @fecha 17/02/2013
     * @function _modeloTable
     * @param modelTable Es DefaultTableModel
     * @param headerTable String[], el cual contiene los nombres de las columnas
     * a llevar, Ej: "Nro","Cod.Alt.", "Apellidos y Nombres", "Hora Entrada",
     * "Hora Salida", "Fecha Registro"
     * @param classTypes Class[], el cual se le asigna valores como:
     * java.lang.Object.class,java.lang.Boolean.class estas son asignadas a cada
     * columna, etc... Ej:
     * java.lang.Object.class,java.lang.Object.class,java.lang.Boolean.class,etc...
     */
    public void _modeloTabla(DefaultTableModel modelTable, String[] headerTable, final Class[] classTypes) {
        modelTable = new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                headerTable //                new String[]{
                //                    //"Nro",
                //                    "Nro","Cod.Alt.", "Apellidos y Nombres", "Hora Entrada", "Hora Salida", "Fecha Registro", "Numero de Registros",
                //                    "Lugar de Marcación", "codAsignacion", "Nombre Estado", "Abreviatura"
                //                }
                ) {
            Class[] types = classTypes;
//            Class[] types = new Class[]{
//                java.lang.Object.class,java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class,
//                java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class
//            };
            @Override
            public Class getColumnClass(int columnIndex) {
                return types[columnIndex];
            }
        };
    }

    /**
     * @author MK
     * @version 1.0
     * @fecha 17/02/2013
     * @param tblTable Es el JTable
     * @param anchoIntColumn Es un array Int[], el cual se asignara el ancho
     * para cada columna
     */
    public void _longitudColumnasJTable(JTable tblTable, int[] anchoIntColumn) {
        System.out.println("tblTable.getColumnCount(): "+tblTable.getColumnCount());
        System.out.println("anchoIntColumn.length: "+anchoIntColumn.length);
        if (tblTable.getColumnCount() == anchoIntColumn.length) {
            int anchoColumna = 0;
//            JViewport scroll =  (JViewport) tblTable.getParent();
//            int ancho = scroll.getWidth();
            TableColumnModel modelColumnTable = tblTable.getColumnModel();
            TableColumn columnaTabla;
            for (int i = 0; i < tblTable.getColumnCount(); i++) {
                columnaTabla = modelColumnTable.getColumn(i);
                anchoColumna = anchoIntColumn[i];
//                anchoColumna = anchoIntColumn[i]*ancho/100;
                columnaTabla.setPreferredWidth(anchoColumna);
            }
        } else {
            System.err.println("___________________Error al cargar las Longitudes a JTable___________________");
            System.err.println("Error al cargar las LONGITUDES DE JTABLE -> " + tblTable.getName());
            System.err.println("------->Numero de Columnas de JTable: " + tblTable.getColumnCount());
            System.err.println("------->Numero de anchoIntColumn[] ingresadas: " + anchoIntColumn.length);
            System.err.println("_____________________________________________________________________________");
        }
    }
    //___________________________________________________________________________________ Soy una barra separadora :)

    /**
     * @function _limpiarTabla
     * @param modelTabla Es el modelo de Tabla que se removera sus filas
     */
    public void _limpiarTabla(DefaultTableModel modelTabla) {
        while (modelTabla.getRowCount() > 0) {
            modelTabla.removeRow(0);
        }
    }

    /**
     * @function setFontTamaño_LetraJTable
     * @param tblJTable
     */
    public void setFontTamano_LetraJTable(JTable tblJTable) {
        tblJTable.setFont(new java.awt.Font("Verdana", 0, 12));
        JTableHeader th;
        th = tblJTable.getTableHeader();
        th.setFont(new java.awt.Font("Verdana", Font.BOLDITALIC, 12));
    }

    /**
     * @function setFontTamaño_LetraJTable
     * @param tblJTable
     * @param nameFuenteString
     * @param tamanoI
     */
    public void setFontTamano_LetraJTable(JTable tblJTable, String nameFuenteString, int tamanoI) {
        tblJTable.setFont(new java.awt.Font(nameFuenteString, 0, tamanoI));
        JTableHeader th;
        th = tblJTable.getTableHeader();
        th.setFont(new java.awt.Font(nameFuenteString, Font.BOLDITALIC, tamanoI));
    }
}
